/*
* Copyright 2017-present Facebook, Inc.
*
* Licensed under the Apache License, Version 2.0 (the "License"); you may
* not use this file except in compliance with the License. You may obtain
* a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
* WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
* License for the specific language governing permissions and limitations
* under the License.
*/
package com.facebook.buck.jvm.java.abi.source;
import static org.junit.Assert.assertNotSame;
import com.facebook.buck.jvm.java.testutil.compiler.CompilerTreeApiParameterized;
import com.google.common.base.Joiner;
import java.io.IOException;
import javax.lang.model.element.TypeElement;
import javax.lang.model.type.ArrayType;
import javax.lang.model.type.DeclaredType;
import javax.lang.model.type.TypeKind;
import javax.lang.model.type.TypeMirror;
import org.junit.Test;
import org.junit.runner.RunWith;
@RunWith(CompilerTreeApiParameterized.class)
public class TypeResolverTest extends CompilerTreeApiParameterizedTest {
@Test
public void testParameterizedTypeResolves() throws IOException {
compile(
Joiner.on('\n')
.join(
"abstract class Foo extends java.util.ArrayList<java.lang.String> { }",
"abstract class Bar extends java.util.ArrayList<java.lang.String> { }"));
TypeElement listElement = elements.getTypeElement("java.util.ArrayList");
TypeElement stringElement = elements.getTypeElement("java.lang.String");
DeclaredType expectedSuperclass = types.getDeclaredType(listElement, stringElement.asType());
TypeElement fooElement = elements.getTypeElement("Foo");
TypeElement barElement = elements.getTypeElement("Bar");
DeclaredType fooSuperclass = (DeclaredType) fooElement.getSuperclass();
DeclaredType barSuperclass = (DeclaredType) barElement.getSuperclass();
assertNotSame(expectedSuperclass, fooSuperclass);
assertSameType(expectedSuperclass, fooSuperclass);
assertSameType(fooSuperclass, barSuperclass);
}
@Test
public void testDeeplyParameterizedTypeResolves() throws IOException {
compile(
Joiner.on('\n')
.join(
"abstract class Foo",
" extends java.util.HashMap<",
" java.util.ArrayList<java.lang.String>, ",
" java.util.HashSet<java.lang.Integer>> { }"));
TypeElement mapElement = elements.getTypeElement("java.util.HashMap");
TypeElement listElement = elements.getTypeElement("java.util.ArrayList");
TypeElement setElement = elements.getTypeElement("java.util.HashSet");
TypeMirror stringType = elements.getTypeElement("java.lang.String").asType();
TypeMirror integerType = elements.getTypeElement("java.lang.Integer").asType();
TypeMirror listStringType = types.getDeclaredType(listElement, stringType);
TypeMirror setIntType = types.getDeclaredType(setElement, integerType);
TypeMirror crazyMapType = types.getDeclaredType(mapElement, listStringType, setIntType);
TypeElement fooElement = elements.getTypeElement("Foo");
assertSameType(crazyMapType, fooElement.getSuperclass());
}
@Test
public void testArrayTypeResolves() throws IOException {
compile("abstract class Foo extends java.util.ArrayList<java.lang.String[]> { }");
TypeElement fooElement = elements.getTypeElement("Foo");
TypeElement listElement = elements.getTypeElement("java.util.ArrayList");
TypeMirror stringType = elements.getTypeElement("java.lang.String").asType();
ArrayType stringArrayType = types.getArrayType(stringType);
DeclaredType expectedSuperclass = types.getDeclaredType(listElement, stringArrayType);
assertSameType(expectedSuperclass, fooElement.getSuperclass());
}
@Test
public void testMultiDimArrayTypeResolves() throws IOException {
compile("abstract class Foo extends java.util.ArrayList<java.lang.String[][]> { }");
TypeElement fooElement = elements.getTypeElement("Foo");
TypeElement listElement = elements.getTypeElement("java.util.ArrayList");
TypeMirror stringType = elements.getTypeElement("java.lang.String").asType();
ArrayType stringArrayType = types.getArrayType(stringType);
ArrayType stringArrayArrayType = types.getArrayType(stringArrayType);
DeclaredType expectedSuperclass = types.getDeclaredType(listElement, stringArrayArrayType);
assertSameType(expectedSuperclass, fooElement.getSuperclass());
}
@Test
public void testPrimitiveArrayTypeResolves() throws IOException {
compile("abstract class Foo extends java.util.ArrayList<int[]> { }");
TypeElement fooElement = elements.getTypeElement("Foo");
TypeElement listElement = elements.getTypeElement("java.util.ArrayList");
TypeMirror intType = types.getPrimitiveType(TypeKind.INT);
ArrayType intArrayType = types.getArrayType(intType);
DeclaredType expectedSuperclass = types.getDeclaredType(listElement, intArrayType);
assertSameType(expectedSuperclass, fooElement.getSuperclass());
}
@Test
public void testTypeVariableResolves() throws IOException {
compile("abstract class Foo<T extends java.lang.Runnable> extends java.util.ArrayList<T> { }");
TypeElement fooElement = elements.getTypeElement("Foo");
TypeElement listElement = elements.getTypeElement("java.util.ArrayList");
TypeMirror tType = fooElement.getTypeParameters().get(0).asType();
DeclaredType expectedSuperclass = types.getDeclaredType(listElement, tType);
assertSameType(expectedSuperclass, fooElement.getSuperclass());
}
}